qianwen_prompt_step1 = r"""## 任务描述
针对用户提交的伪代码，对照规范和标准样例进行检查和改写。
每一条规范可能是「内容描述+给出例子」的形式，需要理解内容，并参考样例，进行检查和改写
针对以下的每个规范类别，重复以下任务步骤：
1. 识别和定位不规范问题
- 逐条检查规范内容，判断原始伪代码是否存在违反规范的问题
- 对每个不规范问题，明确标注其原因和具体位置
- 参考样例中类似情况的处理方式
- 参考数据字典，确保变量使用符合定义
2. 改写不规范的伪代码
- 针对每个不规范问题，按照规范要求和样例示范进行改写  
- 确保改写后的代码符合所有相关规范
- 若提供了数据字典，确保改写后的代码中变量使用与数据字典一致, 包括变量名、数据类型和维度


## 规范类别与内容
### 伪代码书写格式规范
规范内容：
1. 输入代码中有自然语言描述的逻辑，先充分理解描述的内容，再按照规范，改写为标准的伪代码表示方式.例如：
- 改写前：
```
若(a + b == c)
则 d = e + f
```
- 改写后：
```
IF1(a + b == c)
d = e + f;
ENDIF1
```
2. 注释内容，必须采用双斜线 `//` 开头书写。
3. 禁止将非注释形式的自然语言描述或特殊符号，与语句置于同一行，应该拆分成单独的注释行书写，其中表示数字的符号需要在注释中保留。如：
- 改写前：
```
① 注释内容1：
$$a = b_{c}$$
(2) 注释内容2
$$③ c = d_{e}$$
```
- 改写后：
```
// ① 注释内容1：
$$a = b_{c}$$
// (2) 注释内容2
// ③ 
$$c = d_{e}$$
```
4. 伪代码原有的注释, 转换后应该保留，但是禁止添加新的注释
5. 除了控制流语句、关键字，以及注释行以外，每一行伪代码语句必须以分号`;`结尾。多行伪代码用逗号分割的，需要更改为分号`;`分割. 例如：
- 改写前：
```
IF1(c == d)
a = x + 7
b = y + 6
c = a + b, d = a + c
ENDIF1
``` 
- 改写后：
```
IF1(c == d)
a = x + 7;
b = y + 6;
c = a + b; 
d = a + c;
ENDIF1
``` 
6. 赋值语句既可为单个赋值形式，也可为连等赋值形式
7. 若使用条件判断符号（=, ==, !=, >, >= 等），必须在符号左右添空格
8. 伪代码中的公式既可以使用latex代码格式书写，也可以使用纯文本书写
9. 伪代码语句中仅允许使用括号`()`用于表示运算优先级或限定表达式范围
10. 原始伪代码中，被双美元符号`$$`包裹的代码，是latex代码，输出中必须保留对应的双美元符号`$$`。


## 参考样例
### 样例1
- 改写前：
```
$$Tmpr_n1=r_I, Tmpv_n1=v_I$$
```
- 改写后：
```
$$Tmpr_n1=r_I;$$
$$Tmpv_n1=v_I;$$
```
- 问题分析: 参考规范5，将逗号分隔改为分号分隔，保证每个语句均用分号结尾
### 样例2
- 改写前：
```
$$当前测量值LRdata=[ρ_L、α_L·Krad、β_L·Krad]^T$$
$$历史值LRdata_last=[ρ_(L_last)、α_(L_last)·Krad、β_(L_last)·Krad]^T$$
```
- 改写后：
```
//当前测量值
$$LRdata=[ρ_L, α_L·Krad, β_L·Krad]^T;$$
//历史值
$$LRdata_last=[ρ_(L_last), α_(L_last)·Krad, β_(L_last)·Krad]^T;$$
```
- 问题分析：“当前测量值”，“历史值”是注释，参考规范3，自然语言不能和代码置于一行，应该单独写成注释行
### 样例5
- 改写前：
```
调用10.8（同步轨道段自主调头规划模块）
CntAutoTurn = 0；
```
- 改写后：
```
// 调用xx.xx（同步轨道段自主调头规划模块）
CntAutoTurn = 0；
```
- 问题分析：`调用xx.xx` 一类的自然语言，都当做注释处理

### 样例6
- 改写前：
```
PulseCmd[][0]清零；//16个推力器的脉冲个数全部清零
```
- 改写后：
```
// 16个推力器的脉冲个数全部清零
FOR1(i=0:16)
PulseCmd[i][0]=16;
ENDFOR1
```
- 问题分析：参考规范1，将自然语言描述改为伪代码表示

## 数据字典
### 数据字典内容
```
{{ input_dict }}
```

## 步骤要求  
1. 分步执行，每步只完成一个明确操作  
2. 输出格式为：
```json
{
    "REASONING": "### Step[序号]: 检查[检查的规范类别]\n1. [操作描述]\n- [分析过程或中间结果]\n2. [操作描述]\n- [分析过程或中间结果]",
    "CODE": "[输出代码]"
}
```


## 用户输入
用户提交的伪代码是：
```
{{ input_code }}
```
"""

qianwen_prompt_step2 = r"""## 任务描述
针对用户提交的伪代码，对照规范和标准样例进行检查和改写。
每一条规范可能是「内容描述+给出例子」的形式，需要理解内容，并参考样例，进行检查和改写
针对以下的每个规范类别，重复以下任务步骤：
1. 识别和定位不规范问题
- 逐条检查规范内容，判断原始伪代码是否存在违反规范的问题
- 对每个不规范问题，明确标注其原因和具体位置
- 参考样例中类似情况的处理方式
- 参考数据字典，确保变量使用符合定义  
2. 改写不规范的伪代码
- 针对每个不规范问题，按照规范要求和样例示范进行改写  
- 确保改写后的代码符合所有相关规范
- 若提供了数据字典，确保改写后的代码中变量使用与数据字典一致, 包括变量名、数据类型和维度  


## 规范类别与内容
### 控制流结构规范
规范内容：
1. 分支判定表达式，必须放在`()`内，如果有多个条件，允许使用`()`表示表达式优先级或范围
例如：
```
// 单个条件： 条件A
IF1(A)
...
ENDIF1

// 多个条件： 条件A和 条件B
IF1((A==True) && (B==True))
...
ENDIF1
```
2. IF关键字与ELSE、ELSEIF、ENDIF等关键字配合使用，重点注意：结束关键字要用 `ENDIF`不是`END`. 在每个关键字后面增加序号标注层级, 层级编号从1开始，同层级关键字的序号相同，嵌套层级增加，序号递增。例如：
- 改写前：
```
// 单个IF分支、ELSE分支、ELSEIF分支
IF1(A&&B)
ELSEIF1(C)
ELSE1
ENDIF1
// 多个层级的IF, ELSE 分支
IF1(A&&B)
...
    IF2(C&&D)
        IF3(E)
        ...
        ENDIF
    ENDIF2
    IF2(E&&K)
        ...
    ENDIF2
ELSEIF1(C)
    IF2(G == K)
    ...
    ENDIF2
ENDIF1
// 序号不从1开始
IF5(A&&B)
    IF6(C&&D)
    ...
    ENDIF6
ENDIF5
- 改写后：
```
// 单个IF分支、ELSE分支、ELSEIF分支
IF1(A&&B)
ELSEIF1(C)
ELSE1
ENDIF1
// 多个层级的IF, ELSE 分支
IF1(A&&B)
...
    IF2(C&&D)
        IF3(E)
        ...
        ENDIF3
    ENDIF2
    IF2(E&&K)
        ...
    ENDIF2
ELSEIF1(C)
    IF2(G == K)
    ...
    ENDIF2
ENDIF1
// 序号不从1开始
IF1(A&&B)
    IF2(C&&D)
    ...
    ENDIF2
ENDIF1
```
3. `FOR`关键字与`ENDFOR`关键字配合使用，应在每个关键字后面增加序号表明层级，层级需要随着嵌套关系递增。
例如：
```
// 单层循环
FOR1(i=0:NUM_STGR-1)
...
ENDFOR1
// 多层循环
FOR1(i=0:NUM_STGR-1)
    FOR2(j=0:NUM_STGR-1)
    ...
    ENDFOR2
    FOR2(k=0:NUM_STGR-1)
    ...
    ENDFOR2
ENDFOR1
```
4. 禁止采用中文“若……则……否则……”等表示分支结构，应改成 `IF...ELSEIF...ELSE...ENDIF` 这种表示形式
5. 循环变量通常从0开始（为配合数组下标从0开始）
6. 循环变量作为数组下标访问时，应显式的写为数组访问形式，如`A[i]`
7. `WHILE`关键字与`ENDWHILE`关键字配合使用，应在每个关键字后面增加序号表明层级.例如：
```
//多层循环
WHILE1(A)
  WHILE2(B)
  ...
  ENDWHILE2
ENDWHILE1
WHILE1((A == TRUE) && (B == FALSE))
...
ENDWHILE1
```
8. 循环条件判断应放在`()`内，按照`WHILE(满足条件)`的形式，如`WHILE(FLAG)`
9. 去掉控制流结构中无用的花括号`{`和`}`
10. 原始伪代码中，被双美元符号`$$`包裹的代码，是latex代码，输出中必须保留对应的双美元符号`$$`。

## 参考样例
### 样例1
- 改写前：
```
若IAFlg==0且BZ4(D0)==1，则：
a=b
否则：
c=d
```
- 改写后：
```
IF1((IAFlg==0) && (BZ4(D0)==1))
a=b;
ELSE1
c=d;
ENDIF1
```
- 问题分析: 参考规范4，将中文描述的条件关键字用逻辑运算符替换
### 样例2
- 改写前：
```
① 循环i=0~9：	//记录10拍历史数据
▲ 循环j=0~7：
◆ 若i≠9，则：
★ rINS[8∙i+j]=rINS[8∙(i+1)+j]
★ vINS[8∙i+j]=vINS[8∙(i+1)+j]
◆ 否则：
★ 若j==0，则：
$$Tmpr_n1=r_I$$
$$Tmpv_n1=v_I$$
★ 否则：
$$Tmpr_n1=rINS[8∙i+j-1]$$
$$Tmpv_n1=vINS[8∙i+j-1]$$
$$★ Tmpg_n1=LG(Tmpr_n1)$$
$$★ TmpCIB=(Aq(qINS[8∙i+j]))^T$$
$$★ Tmpa_B=Δv_Bm[j]/Δt1$$
$$★ Tmpa_I=TmpCIB·Tmpa_B$$
```
- 改写后：
```
FOR1(i=0:9)
FOR2(j=0:7)
IF1(i≠9)
rINS[8∙i+j]=rINS[8∙(i+1)+j];
vINS[8∙i+j]=vINS[8∙(i+1)+j];
ELSE1
IF2(j==0)
$$Tmpr_n1=r_I;$$
$$Tmpv_n1=v_I;$$
ELSE2
$$Tmpr_n1=rINS[8*i+j-1];$$
$$Tmpv_n1=vINS[8*i+j-1];$$
ENDIF2
$$Tmpg_n1=LG(Tmpr_n1);$$
$$TmpCIB=(Aq(qINS[8∙i+j]))^T;$$
$$Tmpa_B=Δv_Bm[j]/Δt1;$$
$$Tmpa_I=TmpCIB·Tmpa_B;$$
ENDIF1
ENDFOR2
ENDFOR1
```
- 问题分析: 参考规范4，禁止用中文描述表示逻辑层级，需要用标准控制流关键字做替换
### 样例3
- 改写前：
```
FOR n=0;n<16;n++
...
IF(n==0)
...
END
END

```
- 改写后：
```
FOR(n=0:15)
...
IF(n==0)
...
ENDIF
ENDFOR
```
- 问题分析：参考规范3，采用循环规范的循环语句写法

## 数据字典
```
{{ input_dict }}
```

## 步骤要求  
1. 分步执行，每步只完成一个明确操作  
2. 输出格式为：
```json
{
    "REASONING": "### Step[序号]: 检查[检查的规范类别]\n1. [操作描述]\n- [分析过程或中间结果]\n2. [操作描述]\n- [分析过程或中间结果]",
    "CODE": "[输出代码]"
}
```
   

## 用户输入
用户提交的伪代码是：
```
{{ input_code }}
```
"""

qianwen_prompt_step3 = r"""## 任务描述
针对用户提交的伪代码，对照规范和标准样例进行检查和改写。
每一条规范可能是「内容描述+给出例子」的形式，需要理解内容，并参考样例，进行检查和改写
针对以下的每个规范类别，重复以下任务步骤：
1. 识别和定位不规范问题
- 逐条检查规范内容，判断原始伪代码是否存在违反规范的问题
- 对每个不规范问题，明确标注其原因和具体位置
- 参考样例中类似情况的处理方式
- 参考数据字典，确保变量使用符合定义  
2. 改写不规范的伪代码
- 针对每个不规范问题，按照规范要求和样例示范进行改写  
- 确保改写后的代码符合所有相关规范
- 若提供了数据字典，需确保改写后的代码中变量使用与数据字典一致, 包括变量名、数据类型和维度  

## 规范类别与内容
### 数学运算符号与表示
规范内容：
1. 位运算包括了位与 (用BITAND表示)、位或（用BITOR表示）、位异或 (用BITXOR表示)、位取反（用BITNOT表示）等四种，BITAND等位运算关键字前后用空格隔开。禁止位运算使用“&、|、^、~”等符号，防止与其他运算符混淆。
例如：
```
// 位与
AA = AA1 BITAND 0x2;
// 位或
AA = AA1 BITOR 0x2;
// 位异或
AA = AA1 BITXOR 0x2;
// 位取d
AA = BITNOT AA1;
```
2. 移位操作包括左移“<<”与右移“>>”
3. 移位运算左右两边的数据或变量符号必须为整型；
例如：
```
// 左移运算
AA = AA1 << 2;
// 右移运算
BB = BB1 >> 2;
```
4. 数值运算主要针对标量符号，运算分类包括加、减、乘、除、分式、开根号、绝对值、幂次等。
表示符号如下：
```
运算分类 | 运算符	| 示例
乘法 | `\times` 或 `\cdot` 或 `\bullet` 或 `*` 或 `·` | \omega_{m}\times aliCnt，\omega_{m}\bullet aliCnt, \omega_{m} \cdot aliCnt
绝对值  | \left|\right| 或 Fabs/fabs 或 Abs/abs | \left|x\right|, Fabs(x)/fabs(x), Abs(x)/abs(x)
幂次 | {}^{} 或 ^ 或 Pow/pow | {x}^{y}, x^y, Pow(x,y)/pow(x,y)
```
5. 乘法运算符不能省略，原始伪代码中省略的情况可能是数值和表达式之间，也可能是表达式与表达式之间，需要添加任意合法的乘法符号即可
6. 复合条件的逻辑表示符号如下：
```
逻辑与  &&
逻辑或  ||
逻辑非  !
IF1((A) && (B))
...
ENDIF1
IF1((A) || (B))
...
ENDIF1
IF1(A != B)
...
ENDIF1
```
7. 幂指数表示：包括如下两种写法。
```
i. 由数值（2.6617）、乘号“*”、指数（{10}^{-6}）三部分组成, 如：2.6617*{10}^{-6}
ii. 由数值（3.2）、指数（e-5、e5、E-3、E3）两部分组成, 如：3.2e-5、3.2E-3
```
8. 书写三角函数，用括号`()`限定函数参数范围，禁止用其他符号表示限定范围。例如：
- 改写前
```
$$\sin{X_m} \cdot \cos{Y_n};$$
```
- 改写后
```
$$\sin(X_m) \cdot \cos(Y_n);$$
```
9. 关系运算符与逻辑运算符
关系运算符 | 符号	| 备注说明
相等 | =、== | 单等、双等均支持
不等 | !=、≠ |
大于 | > | 若采用公式编辑器中的条件判断符`\le`，必须在符号左右添加空格` \le\ `，否则工具解析不正确；
大于等于 |	>=、≥	|
小于 |	<	|
小于等于 | <=、≤	|
10. 原始伪代码中，被双美元符号`$$`包裹的代码，是latex代码，输出中必须保留对应的双美元符号`$$`。


## 参考样例
### 样例1
- 改写前：
```
$$a = \omega_S[0]\sin(2\phi_{tmp});$$  
```
- 改写后：
```
$$a = \omega_S[0] \bullet \sin(2 * \phi_{tmp});$$
```
- 问题分析：`omega_S[0]`和 `sin(\phi_{tmp})`是两个独立的数值表达式，中间需要增加乘法运算符. `\sin(2\phi_{tmp})` 中数字和表达式之间缺少乘法运算符，需要添加使用任一合法的运算符。
### 样例2
- 改写前：
```
// 位与：错误
AA = AA1 & 0x2;
// 位或：错误
AA = AA1 | 0x2;
// 位异或：错误
AA = AA1 ^ 0x2;
// 位取反：错误
AA = ~ AA1;
```
- 改写后：
```
// 位与：正确写法
AA = AA1 BITAND 0x2;
// 位或：正确写法
AA = AA1 BITOR 0x2;
// 位异或：正确写法
AA = AA1 BITXOR 0x2;
// 位取反：正确写法
AA = BITNOT AA1;
```
- 问题分析：参考规范1，采用规范的位运算表示方法

## 数据字典
```
{{ input_dict }}
```

## 步骤要求  
1. 分步执行，每步只完成一个明确操作  
2. 输出格式为：
```json
{
    "REASONING": "### Step[序号]: 检查[检查的规范类别]\n1. [操作描述]\n- [分析过程或中间结果]\n2. [操作描述]\n- [分析过程或中间结果]",
    "CODE": "[输出代码]"
}
```

## 用户输入
用户提交的伪代码是：
```
{{ input_code }}
```
"""

qianwen_prompt_step4 = r"""## 任务描述
针对用户提交的伪代码，对照规范和标准样例进行检查和改写。
每一条规范可能是「内容描述+给出例子」的形式，需要理解内容，并参考样例，进行检查和改写。
针对下面的每个规范类别，重复以下任务步骤：
1. 识别和定位不规范问题
- 逐条检查规范内容，判断原始伪代码是否存在违反规范的问题
- 对每个不规范问题，明确标注其原因和具体位置
- 参考样例中类似情况的处理方式
- 参考数据字典，确保变量使用符合定义
2. 改写不规范的伪代码
- 针对每个不规范问题，按照规范要求和样例示范进行改写  
- 确保改写后的代码符合所有相关规范
- 若提供了数据字典，需确保改写后的代码中变量使用与数据字典一致, 包括变量名、数据类型和维度  

## 规范类别与内容
### 向量和矩阵的表示与运算
规范内容：
1. 可通过数组形式访问向量/矩阵的元素。
2. 代表一维数值的符号表示，可以为单个符号表示也可采用展开形式书写，也支持“子向量+元素”的书写形式。例如：
```
// 单个符号表示向量
Vec1
Vec2
// 展开方式书写向量
[ωx, ωy, ωz]
[ωx; ωy; ωz]

⁠⁠⁠⁠⁠⁠⁠[\begin{matrix}(x \dot1@y \dot1@z \dot1)]
//“子向量+元素”的向量书写形式，向量为1*4向量，包含子向量HTIT(维度1*3)，元素0
[ HTIT, 0]
```
3. 向量点乘，采用运算符 ·，*，\ast, \cdot, \bullet, 或者调用 dot/dotn库函数。注意向量乘法的表示方法，乘法运算符号必须存在，例如：
```
⁠⁠⁠⁠⁠⁠⁠vecdot=\left[\begin{matrix}\dot{x}0\\\dot{y}0\\\dot{z}0\\\end{matrix}\right]\ast\left[\begin{matrix}\dot{x}1\\\dot{y}1\\\dot{z}1\\\end{matrix}\right]
varA = vecB \cdot vecC
```
4. 矩阵乘法，采用运算符 ·，*，\ast, \cdot, \bullet, 或者调用 MatsMult库函数。注意矩阵乘法的表示方法，乘法运算符号必须存在，例如：
```
// {C}_{Los\_T}是3*3的矩阵, ω_{bi}与ω_{bibrd}为3*1向量
ω_{bibrd} = C_{Los\_T} * ω_{bi}
```
5. 转置操作的书写，则应采用标准幂次符号，上角标为“T”来表示。
例如：
```
{C_{TG}}^{T}
\left[\begin{matrix}Ja11&Ja12&Ja13\\Ja21&Ja22&Ja23\\Ja31&Ja32&Ja33\\\end{matrix}\right]^{T}
```
6. 行向量，维度表示为1*N，文本采用符号“,”或“空格”来分隔向量包含元素，latex 代码采用符号`$`来分隔向量包含元素。例如：
```
// “,”分隔行向量元素
[ωx, ωy, ωz]
// “空格”分隔行向量元素
[ωx ωy ωz]
// latex 代码中 `&` 分隔行向量元素
\left[\begin{matrix}w_x&w_y&w_z\\\end{matrix}\right]
```
7. 列向量，维度表示为N*1，采用符号“;”或“回车换行”来分隔向量包含元素。latex 代码采用符号`\\`来分隔向量包含元素。例如：
```
// “;”分隔列向量元素
[ωx; ωy; ωz]
// latex 代码采用`\\`分隔列向量元素
\left[\begin{matrix}x_1\\y_1\\z_1\\\end{matrix}\right]
```
8.通过符号":"来表征向量的部分访问，如1*N维向量“Vec[n:m]”，“:”左边数字n代表起始位置，“:”右边数字m代表结束位置，应满足n<m并且m<N并且n>=0。示例：
```
// 向量Vec为1*4向量，
向量Vec2为1*3向量，
向量Vec3为1*3向量
// 将向量Vec的前2个元素赋值为1
Vec[0:1] = {1};
//向量Vec2的后2个元素分别赋值为不同值
Vec2[1:2] = {1, 100};
// 将向量Vec的前3个元素赋值给向量Vec2
Vec3[] = Vec[0:2];
```
9.代表二维数值的符号，即可为单个符号表示，也可采用展开形式书写，采用符号“[]”或“{}”作为矩阵的限定范围.
```
// 单个符号表示矩阵
Mat1
C_{BF}
// 展开方式书写矩阵
// 多个向量符号组成一个矩阵
[VGi^{T}; VGj^{T}; VGk^{T}]
// 多个标量符号组成一个矩阵
[ Jxx -Jxy -Jxz;
-Jxy Jyy -Jyz;
-Jxz -Jyz Jzz]
```
10. 如果向量或矩阵访问用括号`()`表示，需要更改为方括号`[]`,且下标保证是从0开始
11. 若矩阵由标量符号组合而成，采用符号“,”或“空格”来分隔一行包含元素；采用符号“;”来分隔行与行。
12. 通过省略下标的方式来表征整个矩阵的访问，如“Mat[][]或Mat”，也可以是矩阵某一行或某一列的访问，如“第0行，Mat[0][]”、“第1列，Mat[][1]”。
13. 通过符号“:”来表征矩阵的部分访问，如M*N维矩阵“Mat[m1:m2][n1:n2]”，“:”左边数字m1代表行起始位置，n1代表列起始位置；“:”右边数字m2代表行结束位置，n2代表列结束位置，应满足（m1<m2并且m2<M并且m1>=0）或者（n1<n2并且n2<N并且n1>=0）
14. 支持矩阵分块书写形式，例如：
```
// AA为9*9矩阵,AA11~AA33为3*3矩阵
AA= \left[\begin{matrix}AA11&AA12&AA13\\AA21&AA22&AA23\\AA31&AA32&AA33\\\end{matrix}\right]
```
15. 单位阵表示包括带维度信息与不带维度信息两种：带维度信息，以下标方式“I_{n×n}”明确单位阵维度，如“I_{3×3}”；不带维度信息，以“{I}”表示单位阵，其维度通过赋值操作左值维度来确定。
16. 参与加减运算、乘法的向量或矩阵既可采用符号书写，又可采用展开方式书写。
17. 向量叉乘，采用运算符“\times”、“×”或调用cross库函数。
18. 向量/矩阵乘以系数，采用运算符“·”或“*”或“\bullet”, “\cdot”, 或用MatkMult库函数。
19. 原始伪代码中，被双美元符号`$$`包裹的代码，是latex代码，输出中必须保留对应的双美元符号`$$`。

## 参考样例
### 样例1
- 改写前：
```
$$\left[\begin{matrix}T_{wcx}\\T_{wcy}\\T_{wcz}\\\end{matrix}\right]=-\left[\begin{matrix}0&-\omega_z&\omega_y\\\omega_z&0&-\omega_x\\-\omega_y&\omega_x&0\\\end{matrix}\right]\left(J_0\bullet\left[\begin{matrix}\omega_x\\\omega_y\\\omega_z\\\end{matrix}\right]+\left[\begin{matrix}H_x\\H_y\\H_z\\\end{matrix}\right]\right);$$
```
- 改写后：
```
$$\left[\begin{matrix}T_{wcx}\\T_{wcy}\\T_{wcz}\\\end{matrix}\right]=-\left[\begin{matrix}0&-\omega_z&\omega_y\\\omega_z&0&-\omega_x\\-\omega_y&\omega_x&0\\\end{matrix}\right]\bullet\left(J_0\bullet\left[\begin{matrix}\omega_x\\\omega_y\\\omega_z\\\end{matrix}\right]+\left[\begin{matrix}H_x\\H_y\\H_z\\\end{matrix}\right]\right);$$
```
- 问题分析：两个矩阵之间缺少乘法符号，乘法符号不能省略，需要添加。

## 数据字典
```
{{ input_dict }}
```

## 步骤要求  
1. 分步执行，每步只完成一个明确操作  
2. 输出格式为：
```json
{
    "REASONING": "### Step[序号]: 检查[检查的规范类别]\n1. [操作描述]\n- [分析过程或中间结果]\n2. [操作描述]\n- [分析过程或中间结果]",
    "CODE": "[输出代码]"
}
```

## 用户输入
用户提交的伪代码是：
```
{{ input_code }}
```
"""

qianwen_prompt_step5 = r"""## 任务描述
针对用户提交的伪代码，对照改写要求，进行检查和改写。每一条要求可能是`内容描述+示例`的形式，需要理解内容，并参考示例，
针对“改写要求”部分给出的每个一条，重复以下任务步骤：
1. 识别和定位不规范问题
- 逐条检查要求的内容，判断原始伪代码是否存在违反规范的问题
- 对每个不规范问题，明确标注其原因和具体位置
- 参考数据字典，确保变量使用符合定义
2. 改写不规范的伪代码
- 针对每个不规范问题，按照要求和进行改写
- 确保改写后的代码符合所有要求

## 改写要求
1. 伪代码中的变量，如果和数据字典中 json 键的写法不一致但是相似，你推断出两者应该表示的是同一个变量，就按照数据字典的键值写法进行替换。注意：数据字典的键为latex代码时，有的包含双斜线`\\`，这是为了在json数据中表示转义，改写后的变量名中必须把双斜线`\\`替换为单斜线`\`例如：
- 数据字典
```
{
   "{φ}_{SS0}": {
      "type": "float64",
      "dim": "1"
   },
   "{SAMPara.P}_{SearchW}": {
    "type": "float64",
    "dim": "3*1"
   },
   "\\theta_{12}": {
      "type": "float64",
      "dim": "3*1"
   },
   "{\\hat{\\omega}}_x": {
    "type": "float64",
    "dim": "1*1"
   }
}
```
- 改写前：
```
SAMPara.PSearchW[1]=fabs(SAMPara.ωPRASM)*cos(φSS0);
a = θ12;
{\hat{\omega}}_x=0
```
- 改写后：
```
{SAMPara.P}_{SearchW}[1]=fabs(SAMPara.ωPRASM)*cos({φ}_{SS0});
a = \theta_{12};
{\hat{\omega}}_x=0
```
- 改写规则：数据字典变量名 \\theta_{12} 替换为 \theta_{12}；公式中的{\hat{\omega}}_x符合数据字典的表示，不需要改写。
2. 用户输入的伪代码中，如果包含特定的方法名和变量名，在输出中注意保留
3. 对变量`i`，在注释中明确说明`i`的多个赋值。先理解伪代码的逻辑，理解注释信息中的枚举意图，对变量替换后进行枚举展开，用IF语句、或者FOR循环展开每种`i`的取值逻辑分支，改写后的结果要确保伪代码逻辑正确。注意：如果没有注释，则不做替换
例如：
- 改写前：
```
IF1 F_StiUsed=1 // i=A、B、C、F
F_StiUsed = F_StiUsed + 1;
END1
```
- 改写后：
```
IF1 (F_StAUsed=1)
F_StAUsed = F_StAUsed + 1;
ENDIF1
IF1 (F_StBUsed=1)
F_StBUsed = F_StBUsed + 1;
ENDIF1
IF1 (F_StCUsed=1)
F_StCUsed = F_StCUsed + 1;
ENDIF1
IF1 (F_StFUsed=1)
F_StFUsed = F_StFUsed + 1;
ENDIF1
```
4. 避免混淆的注释和代码转换，对于包含数据范围定义的注释，如果它不影响实际代码的逻辑（如只是变量定义），应当改写为注释而不是转化为代码逻辑，比如：
- 改写前：
```
//（1）记号
u∈[1×3], P∈[1×2], V∈[1×2];
```
- 改写后：
```
//（1）记号
// u∈[1×3], P∈[1×2], V∈[1×2];
```
5. 多重赋值语句的拆解：
将同一行中多个赋值操作的语句拆分为单独的语句。例如：
- 改写前：
```
$$\delta q_x = \delta q_y = \delta q_z = 0.0;$$
```
- 改写后：
```
$$\delta q_x = 0.0;$$
$$\delta q_y = 0.0;$$
$$\delta q_z = 0.0;$$
```
- 改写规则：任何形式的多重赋值（即多个变量在同一行被赋相同值），需要拆分为逐个赋值的形式。
6. 原始伪代码中，被双美元符号`$$`包裹的代码，是latex代码，输出中必须保留对应的双美元符号`$$`。

## 数据字典
```
{{ input_dict }}
```

## 步骤要求  
1. 分步执行，每步只完成一个明确操作  
2. 输出格式为：
```json
{
    "REASONING": "### Step[序号]: 检查[检查的规范类别]\n1. [操作描述]\n- [分析过程或中间结果]\n2. [操作描述]\n- [分析过程或中间结果]",
    "CODE": "[输出代码]"
}
```

## 用户输入
用户提交的原始伪代码是：
```
{{ raw_input_code }}
```
上一步改写后的伪代码是：
```
{{ input_code }}
```
"""

qianwen_prompt_step6 = r"""## 任务描述
针对用户提交的伪代码，对照改写要求，进行检查和改写。每一条要求可能是`内容描述+示例`的形式，需要理解内容，并参考示例，
针对“改写要求”部分给出的每个一条，重复以下任务步骤：
1. 识别和定位不规范问题
- 逐条检查要求的内容，判断原始伪代码是否存在违反规范的问题
- 对每个不规范问题，明确标注其原因和具体位置
- 参考数据字典，确保变量使用符合定义
2. 改写不规范的伪代码
- 针对每个不规范问题，按照要求和进行改写
- 确保改写后的代码符合所有要求


## 改写要求
1. latex书写矩阵，元素分割符号：用"&"分隔行间符号；用"\\"表示换行。必须注意保留原始代码中的矩阵分割符
例如：一个3行3列的矩阵表示形式如下：
```
\left[\begin{matrix}
a & b & c \\
d & e & f \\
g & h & i \\\end{matrix}\right]
```
2. 伪代码中，数值或表达式之间乘法运算，应以乘法运算符显示表示，不能省略乘法运算符。例如：
- 改写前：
```
$$0.234\sin(2x)$$
```
- 改写后：
```
// 使用任一合法的乘法运算符
$$0.234\bullet\sin(2\bulletx)$$
```
3. 详细检查是否有以下乘法符号丢失的情况，包括：
- 数值和表达式之间
- 表达式和表达式之间
- 矩阵或向量元素内的表达式和表达式之间
- 矩阵或向量元素内的数值和表达式之间
- 矩阵和矩阵之间，向量和向量之间
以上情况都需要显式增加公式间的乘法运算符号，比如：
- 改写前：
```
// 数值和表达式
$$a=29.78\sin(u_s);$$
// 表达式和表达式
$$v=-\left[\begin{matrix}a&b&c\\\end{matrix}\right]\left(x\bullet y\right);$$
// 矩阵或向量元素内的数值和表达式之间
$$v_{orbit}=\left[\begin{matrix}\frac{h}{r}\bullet c_{11}-\dot{R}\bullet c_{31}+29.78\sin{u_s};\\\frac{h}{r}\bullet c_{12}-\dot{R}\bullet c_{32}-27.322614\sin{u_s};\\\end{matrix}\right];$$
// 矩阵或向量元素内的表达式和表达式之间
$$r=\left[\begin{matrix}-\cos{\left(i_{orbit}\right)}\sin{\left(\Omega_{orbit}\right)} & \cos{\left(i_{orbit}\right)}\cos{\left(\Omega_{orbit}\right)} & \sin{\left(i_{orbit}\right)}\\\end{matrix}\right];$$
// 矩阵和矩阵之间
$$z = -\left[\begin{matrix}a&b&c\\\end{matrix}\right]\left[\begin{matrix}a \\ b \\ c\\\end{matrix}\right];$$
```
- 改写后：
```
$$a=29.78\bullet\sin(u_s);$$
$$v=-\left[\begin{matrix}a&b&c\\\end{matrix}\right]\bullet\left(x\bullet y\right);$$
$$v_{orbit}=\left[\begin{matrix}\frac{h}{r}\bullet c_{11}-\dot{R}\bullet c_{31}+29.78\bullet\sin(u_s);\\\frac{h}{r}\bullet c_{12}-\dot{R}\bullet c_{32}-27.322614\bullet\sin(u_s);\\\end{matrix}\right];$$
$$r=\left[\begin{matrix}-\cos(\left(i_{orbit}\right))\bullet\sin(\left(\Omega_{orbit}\right)) & \cos(\left(i_{orbit}\right))\bullet\cos(\left(\Omega_{orbit}\right)) & \sin(\left(i_{orbit}\right))\\\end{matrix}\right];$$
$$z = -\left[\begin{matrix}a&b&c\\\end{matrix}\right]\bullet\left[\begin{matrix}a \\ b \\ c\\\end{matrix}\right];$$
```
4. 检查三角函数的参数范围是否用括号`()`表示，有些用例中会用花括号 `{}` 表示，这是错误的，需要更改，例如：
- 改写前
```
$$ \sin{X_m} \bullet \cos{Y_n} $$
```
- 改写后
```
$$ \sin(X_m) \bullet \cos(Y_n) $$
```
5. 将伪代码中所有的分式符号 `\sfrac` 替换为 `\frac`，`sfrac` 替换为 `frac`
- 改写前
```
$$IF1 (\left|\psi_b\right| > \sfrac{\pi}{2})$$
        $${\hat{\omega}}_y = {ω}_{Earth};$$ // 当前地球自转角速度为{ω}_{Earth}
   ELSE1
   $${\hat{\omega}}_y = -{ω}_{Earth};$$
$$ENDIF1$$
```
- 改写后
```
$$IF1 (\left|\psi_b\right| > \frac{\pi}{2})$$
        $${\hat{\omega}}_y = {ω}_{Earth};$$ // 当前地球自转角速度为{ω}_{Earth}
   $$ELSE1$$
   $${\hat{\omega}}_y = -{ω}_{Earth};$$
$$ENDIF1$$
```
6. 改写不规范的注释写法
- 改写前
```
 (1)//F_WheelInSys位为1的各飞轮j进行剔野：
Hwj = mlf1(Hwj, 60.0); //mlf1()为限幅函数，5520rpm
```
- 改写后
```
//(1)F_WheelInSys位为1的各飞轮j进行剔野：
Hwj = mlf1(Hwj, 60.0); //mlf1()为限幅函数，5520rpm
```
7. 检查双美元符号`$$`是否正确保留。 用户提交的原始伪代码中被标注的行，是latex代码，输出中必须对应保留双美元符号`$$`


## 数据字典
```
{{ input_dict }}
```

## 步骤要求  
1. 分步执行，每步只完成一个明确操作  
2. 输出格式为：
```json
{
    "REASONING": "### Step[序号]: 检查[检查的规范类别]\n1. [操作描述]\n- [分析过程或中间结果]\n2. [操作描述]\n- [分析过程或中间结果]",
    "CODE": "[输出代码]"
}
```

## 用户输入
用户提交的原始伪代码是：
```
{{ raw_input_code }}
```
上一步改写后的伪代码是：
```
{{ input_code }}
```
"""

qianwen_prompt_steps = [
    qianwen_prompt_step1, 
    qianwen_prompt_step2, 
    qianwen_prompt_step3, 
    qianwen_prompt_step4, 
    qianwen_prompt_step5, 
    qianwen_prompt_step6
    ]


qianwen_system_prompt = """**角色定义**:  
你是一名高级卫星开发工程师，专注于将伪代码按照规范进行改写。

**任务描述**:  
根据用户提供的伪代码，检查并将其改写为符合规范的伪代码。如果伪代码已经符合规范，则输出json中的CODE字段为空。

**行为规范**:  
- 严格遵循所有伪代码规范和要求，不得忽略任何一条。确保改写后的代码完全符合规范。
- 仅根据提供的规范进行改写，不得添加额外功能或改变任务目标。
- 保留原始伪代码中符合规范的符号或公式，不能替换或改写。不同的表示方式之间不做改写替换。
- 可以参考数据字典确定变量名、维度和数据类型
- 如果伪代码完全符合规范，则输出json中的CODE字段为空。


**输出格式**:
- 严格按照json格式输出，必须只包含以下两个键值对：
  1. REASONING: 中间过程的思考推理结果，以字符串形式描述。
  2. CODE: 改写后的规范伪代码，以字符串形式输出。如果不需要改写，则输出json中的CODE字段为空。

- 示例:  
```json
{
    "REASONING": "Step 1: 检查规范1 ... Step 2: 检查规范2 ...",
    "CODE": "改写后的伪代码内容"
}
```
"""